package com.xuzm.demo.util;

import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * <p>
 * Title: 工具类
 * </p>
 * <p>
 * Description: 数据校验类
 * </p>
 * <p>
 * Copyright: Copyright (c) 2019
 * </p>
 */
public class DataCheckUtil {

    private final static String DOUBLE_NUMBER_PATTERN = "[0-9]+(\\.[0-9]{1,2})?";
    private final static String MIDDLE_LINE = "-";

    /**
     * 校验字段必填
     *
     * @param map
     *            数据Map
     * @param errorStr
     *            错误提示
     * @param fieldName
     *            字段名称
     * @return 错误提示
     */
    public static String checkRequired(Map<String, Object> map, String errorStr, String fieldName) {
        if (null == map.get(fieldName) || "".equals(map.get(fieldName))) {
            errorStr = errorStr + fieldName + "不能为空，";
        }
        return errorStr;
    }

    /**
     * 校验字段的长度
     *
     *
     * @param map
     *            数据Map
     * @param errorStr
     *            错误提示
     * @param fieldName
     *            字段名称
     * @param length
     *            长度
     * @return 错误提示
     */
    public static String checkFiledLength(Map<String, Object> map, String errorStr, String fieldName, int length) {
        if (null != map.get(fieldName) && !"".equals(map.get(fieldName))) {
            String value = map.get(fieldName).toString().trim();
            if (value.length() > length) {
                errorStr = errorStr + fieldName + "长度不能超过" + length + "个字符，";
            }
        }

        return errorStr;
    }

    /**
     * 校验字段的值是否是数字
     *
     * @param map
     *            数据Map
     * @param errorStr
     *            错误提示
     * @param fieldName
     *            字段名称
     * @return 错误提示
     */
    public static String checkNumber(Map<String, Object> map, String errorStr, String fieldName) {
        if (null != map.get(fieldName) && !"".equals(map.get(fieldName))) {
            String value = map.get(fieldName).toString().trim();
            try {
                Integer.parseInt(value);
                if (value.indexOf(MIDDLE_LINE) > -1) {
                    errorStr = errorStr + fieldName + "输入的数字不合法，必须是正数，";
                }
            } catch (Exception e) {
                errorStr = errorStr + fieldName + "必须是整数，";
            }
        }
        return errorStr;
    }

    /**
     * 校验字段的值是否是小数，两位小数(正实数)
     *
     * @param map
     *            数据Map
     * @param errorStr
     *            错误提示
     * @param fieldName
     *            字段名称
     * @return 错误提示
     */
    public static String checkDoubleNumber(Map<String, Object> map, String errorStr, String fieldName) {
        if (null != map.get(fieldName) && !"".equals(map.get(fieldName))) {
            String value = map.get(fieldName).toString().trim();
            try {
                double tempZero = 0.0;
                double tempDouble = Double.parseDouble(value);
                if (tempDouble == tempZero) {
                    errorStr = errorStr + fieldName + "不能为0，";
                } else {
                    if (value.indexOf(MIDDLE_LINE) > -1) {
                        errorStr = errorStr + fieldName + "输入的数字不合法，必须是正数，";
                    } else {
                        Pattern pattern = Pattern.compile(DOUBLE_NUMBER_PATTERN);
                        if (!pattern.matcher(value).matches()) {
                            errorStr = errorStr + fieldName + "输入的数字不合法，小数最多为两位，";
                        }
                    }
                }

            } catch (Exception e) {
                errorStr = errorStr + fieldName + "必须是数字，";
            }
        }
        return errorStr;
    }

    /**
     * 校验字段的值是否是有效的
     *
     *
     * @param map
     *            数据Map
     * @param errorStr
     *            错误提示
     * @param fieldName
     *            字段名称
     * @param codeType
     *            码类型，可以为空。（有效数据的Map：key：为codeType+value)
     * @param dataMap
     *            存放有效数据的Map
     * @return 错误提示
     */
    public static String checkCode(Map<String, Object> map, String errorStr, String fieldName, String codeType,
            Map<String, Object> dataMap) {
        if (null != map.get(fieldName) && !"".equals(map.get(fieldName))) {
            String value = map.get(fieldName).toString().trim();

            if (null == dataMap.get(codeType + value) || "".equals(dataMap.get(codeType + value))) {
                errorStr = errorStr + fieldName + "填写的不正确，";
            }
        }

        return errorStr;
    }

    /**
     * 校验时间格式的字符串
     *
     *
     * @param map
     *            数据Map
     * @param errorStr
     *            错误提示
     * @param fieldName
     *            字段名称
     * @param formatStr
     *            时间格式化字符串，如果不传递默认为 "YYYY-MM-DD"
     * @return 错误提示
     */
    public static String checkDate(Map<String, Object> map, String errorStr, String fieldName, String formatStr) {
        if (null != map.get(fieldName) && !"".equals(map.get(fieldName))) {
            String value = map.get(fieldName).toString().trim();
            String tempFormatStr = "YYYY-MM-DD";
            if (null != formatStr && !"".equals(formatStr)) {
                tempFormatStr = formatStr;
            }
            try {
                SimpleDateFormat df = new SimpleDateFormat(tempFormatStr);
                df.parse(value);
            } catch (Exception e) {
                errorStr = errorStr + fieldName + "格式不正确，";
            }
        }

        return errorStr;
    }

}
